import os
import pandas as pd
import matplotlib.pyplot as plt
from transformers import pipeline
from sklearn.feature_extraction.text import CountVectorizer
from wordcloud import WordCloud

# 解决中文显示问题：指定字体为 SimHei (Windows 中的黑体)，或其他中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 适用于 Windows 系统，确保 matplotlib 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 加载情感分析模型
sentiment_analysis = pipeline("sentiment-analysis", model="./model")

# 加载数据
data = pd.read_csv("data.csv")

# 使用第 1 列作为评论列
comments_column = data.columns[0]
data['sentiment'] = data[comments_column].apply(lambda x: sentiment_analysis(x, truncation=True)[0]['label'])

# 将情感标签转换为更具可读性的标签
data['sentiment'] = data['sentiment'].map({'LABEL_0': 'Positive', 'LABEL_1': 'Negative'})  # 映射标签为 Positive 和 Negative

# 统计情感分布
sentiment_counts = data['sentiment'].value_counts()

# 1. 情感分布的柱状图
plt.figure(figsize=(8, 6))
sentiment_counts.plot(kind='bar', color=['skyblue', 'orange'])
plt.title('Sentiment Analysis Results (Bar Chart)', fontsize=16)
plt.xlabel('Sentiment', fontsize=14)
plt.ylabel('Count', fontsize=14)
plt.xticks(rotation=0)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.savefig("sentiment_bar_chart.png")  # 保存为图片

# 2. 情感分布的饼图
plt.figure(figsize=(8, 6))
sentiment_counts.plot(kind='pie', autopct='%1.1f%%', colors=['skyblue', 'orange'], startangle=90)
plt.title('Sentiment Proportions (Pie Chart)', fontsize=16)
plt.ylabel('')
plt.tight_layout()
plt.savefig("sentiment_pie_chart.png")  # 保存为图片

# 3. 评论长度与情感分布的散点图
data['comment_length'] = data[comments_column].apply(len)
plt.figure(figsize=(8, 6))
plt.scatter(data['comment_length'], data['sentiment'].apply(lambda x: {'Positive': 0, 'Negative': 1}.get(x, -1)), alpha=0.6)
plt.title('Comment Length vs Sentiment (Scatter Plot)', fontsize=16)
plt.xlabel('Comment Length', fontsize=14)
plt.ylabel('Sentiment (0: Positive, 1: Negative)', fontsize=14)
plt.tight_layout()
plt.savefig("comment_length_vs_sentiment.png")  # 保存为图片

# 4. 每种情感类别的评论长度分布
plt.figure(figsize=(8, 6))
for sentiment in sentiment_counts.index:
    subset = data[data['sentiment'] == sentiment]
    plt.hist(subset['comment_length'], bins=20, alpha=0.5, label=sentiment)
plt.title('Comment Length Distribution by Sentiment', fontsize=16)
plt.xlabel('Comment Length', fontsize=14)
plt.ylabel('Frequency', fontsize=14)
plt.legend(title='Sentiment')
plt.tight_layout()
plt.savefig("comment_length_distribution_by_sentiment.png")  # 保存为图片

# 5. 读取停用词文件
with open('stopwords.txt', 'r', encoding='utf-8') as file:
    stopwords = file.read().splitlines()

# 6. 使用自定义停用词进行词频统计
vectorizer = CountVectorizer(stop_words=stopwords)
X = vectorizer.fit_transform(data[comments_column])

# 7. 直接在稀疏矩阵上计算词频
word_freq = X.sum(axis=0).A1  # .A1 将稀疏矩阵转换为一个一维数组
word_freq = pd.Series(word_freq, index=vectorizer.get_feature_names_out()).sort_values(ascending=False)

# 8. 绘制词频统计的柱状图
plt.figure(figsize=(10, 6))
word_freq.head(20).plot(kind='bar', color='skyblue')
plt.title('Top 20 Most Frequent Words', fontsize=16)
plt.xlabel('Words', fontsize=14)
plt.ylabel('Frequency', fontsize=14)
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig("word_frequency_bar_chart.png")  # 保存为图片

# 9. 绘制词云
wordcloud = WordCloud(font_path="C:/Windows/Fonts/simhei.ttf", width=800, height=400, background_color='white').generate_from_frequencies(word_freq)

# 显示并保存词云
plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('Word Cloud', fontsize=16)
plt.tight_layout()
plt.savefig("word_cloud.png")  # 保存为图片

# 10. 保存分析结果到 CSV 文件
data.to_csv("sentiment_results.csv", index=False)

# 显示所有图表
plt.show()
